import multiprocessing
import threading

import time
import os
"""
fork  - fork python interpreter, get a copy of parent process
spawn - create a fresh python interpreter
forkserver
"""

"""
## fork 只支持unix系（包括linux），比spawn快
def task1(name):
    # time.sleep(2)
    print(outer_name)
    print(f"{name} do task1")


if __name__  == '__main__':
    multiprocessing.set_start_method("fork")
    outer_name = []
    outer_name.append("123")
    p = multiprocessing.Process(target=task1, args=("xx",))
    p.start()
    outer_name.append("567")
"""


"""
## spaw（unix和win支持，支持最广）,forkserver（部分unix） 共享只共享必备的资源，变量参数只能用参数传
def task1(name,outer_name):
    # time.sleep(2)
    print(outer_name)
    print(f"{name} do task1")


if __name__  == '__main__':
    multiprocessing.set_start_method("spawn")
    outer_name = []
    outer_name.append("123")
    p = multiprocessing.Process(target=task1, args=("xx", outer_name))
    p.start()
    outer_name.append("567")
 """
"""
os.path.join()：用于将多个路径组合成一个路径。例如，os.path.join(‘path1’, ‘path2’, ‘path3’) 将返回 ‘path1/path2/path3’。
os.path.exists()：用于检查路径是否存在。例如，os.path.exists(‘path/to/file’) 将返回 True 或 False。
os.path.isdir()：用于检查路径是否是一个目录。例如，os.path.isdir(‘path/to/directory’) 将返回 True 或 False。
os.path.isfile()：用于检查路径是否是一个文件。例如，os.path.isfile(‘path/to/file’) 将返回 True 或 False。
os.path.abspath()：用于获取一个路径的绝对路径。例如，os.path.abspath(‘path/to/file’) 将返回文件的绝对路径。
os.path.basename()：用于获取路径的文件名部分。例如，os.path.basename(‘path/to/file’) 将返回 ‘file’。
os.path.dirname()：用于获取路径的目录部分。例如，os.path.dirname(‘path/to/file’) 将返回 ‘path/to’
current_path = os.getcwd()
"""
"""
## 写文件的内存状态被复制，导致创建子进程前的内存信息被刷写两次文件
code_path = os.path.abspath(__file__)
print("path:", code_path)
running_path = os.getcwd()
print("path:", running_path)
def task1(name,outer_name):
    # time.sleep(2)
    print(outer_name)
    file_object.write("alex\n")
    file_object.flush()


if __name__  == '__main__':
    multiprocessing.set_start_method("fork")
    outer_name = []
    outer_name.append("123")
    file_object = open(os.path.join(os.path.dirname(code_path), 'x1.txt'), mode="w+", encoding='utf-8')
    file_object.write("tony\n") # 写内存，手动触发或系统触发才能写文件
    p = multiprocessing.Process(target=task1, args=("xx", outer_name))
    p.start()
"""


## 锁及锁状态被复制

def func(i):
    with lock:
        print(f"func{i}...")
        outer_name.append(i)
        print(outer_name)


def task1(name,outer_name):
    # 线程锁，由子进程的主线程申请到了（注意：只是在一个进程中只有一个线程能获得锁）
    print("main....")
    outer_name.append(name)
    print(outer_name)
    # lock.release() 放上，放下一样
    for i in range(10):
        t = threading.Thread(target=func,args=(i,))
        # t.setDaemon(True)
        t.start()
    lock.release()


# 子进程；且进程内有多线程
if __name__  == '__main__':
    multiprocessing.set_start_method("fork")
    outer_name = []
    outer_name.append(111)
    lock = threading.RLock()
    print(lock)
    lock.acquire() 
    print(lock)
    p1 = multiprocessing.Process(target=task1, args=("xx", outer_name))
   # p2 = multiprocessing.Process(target=task1, args=("xxxx", outer_name))
    p1.start()
    p1.join()
    print(outer_name)
   # p2.start()